/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package rpt.bd.cenario;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Roberto
 */
public class CConjuntoDadosBd extends CConjuntoDados {

    protected CGlobal fGlobal = null;
    protected CConectorBd fConectorBd = null;
    protected Connection fConnection = null;
    //protected Statement fStatment = null;
    protected CPersistenciaBd fPertinenciaBd = null;
    protected CEstruturaRegistroBd fEstruturaRegistroBd = null;
    protected String fQueryStr = null;

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public CConjuntoDadosBd(
            final CGlobal aGlobal,
            final CPersistenciaBd aPertinenciaBd,
            final boolean aPreparar,
            final boolean aCarregar) {
        //
        super(aPreparar);
        fGlobal = aGlobal;
        fPertinenciaBd = aPertinenciaBd;
        fEstruturaRegistroBd = fPertinenciaBd.getEstruturaRegistroBd();
        fConectorBd = fGlobal.getConectorBd();
        fConnection = fConectorBd.getConnection();
        //fStatment = fConectorBd.getStatement();
        if (aCarregar) {
            carregarConjuntoDados();
        }
        preparar(aPreparar);
    }

    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/
    public CConjuntoDadosBd(
            final CGlobal aGlobal,
            final CPersistenciaBd aPertinenciaBd,
            final String aQueryStr,
            final boolean aPreparar) {
        //
        this(aGlobal, aPertinenciaBd, false, false);
        fQueryStr = aQueryStr;
        preparar(aPreparar);
    }

    @Override
    protected void preparar(final boolean aPreparar) {
        if (aPreparar) {
            carregarConjuntoDados();
        }
    }

    /**
     * 
     * @return 
     */
    public String getQueryConjuntoDadosBd() {
        return fQueryStr;
    }

    /**
     * 
     * @return 
     */
    public CConectorBd getConectorBd() {
        if (fGlobal == null) {
            return null;
        } else {
            return fGlobal.getConectorBd();
        }
    }

    /**
     * 
     * @return 
     */
    public Connection getConnection() {
        CConectorBd c = getConectorBd();
        if (c == null) {
            return null;
        } else {
            return c.getConnection();
        }
    }

    /**
     * 
     * @return 
     */
    private Statement getStatement() {
        CConectorBd c = getConectorBd();
        if (c == null) {
            return null;
        } else {
            return c.getStatement();
        }
    }

    /**
     * 
     * @param aConjuntoDadosDetalhe 
     */
    @Override
    public void sincronizarConjuntoDadosDetalhe(CConjuntoDados aConjuntoDadosDetalhe) {
        super.sincronizarConjuntoDadosDetalhe(aConjuntoDadosDetalhe);
        if (aConjuntoDadosDetalhe instanceof CConjuntoDadosBd) {
            ((CConjuntoDadosBd) aConjuntoDadosDetalhe).recarregarConjuntoDados();
        }
    }

    /**
     * 
     * @param aQuery
     * @param fNomeClasse
     * @return 
     */
    public ResultSet execSelect(
            final String aQuery,
            final Statement aStatement,
            final String fNomeClasse) {
        //
        if (fGlobal == null) {
            return null;
        }
        CConectorBd c = fGlobal.getConectorBd();
        if (c == null) {
            return null;
        }
        return c.execSelect(aQuery, aStatement, fNomeClasse);
        /*
        ResultSet vRs = null;
        if (aQuery != null) {
        Connection vConnection = vConectorBd.getConnection();
        Statment vStatment = vConectorBd.getConnection();
        try {
        vRs = fStatment.executeQuery(aQuery);
        } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,ex.getMessage());
        vRs = null;
        Logger.getLogger(fNomeClasse).log(Level.SEVERE, null, ex);
        }
        }
        return vRs;
         * 
         */
    }

    /**
     * 
     * @param aQueryStr
     * @param aIdentificadorLog
     * @return 
     */
    public int execUpdate(
            final String aQueryStr,
            final Statement aStatement,
            final String aIdentificadorLog) {
        if (fGlobal == null) {
            return -3;
        }
        CConectorBd c = fGlobal.getConectorBd();
        if (c == null) {
            return -4;
        }
        return c.execUpdate(aQueryStr, aStatement, true, aIdentificadorLog);
        /*
        int vResultado = -1;
        
        try {
        fStatment.executeUpdate(aQueryStr,Statement.RETURN_GENERATED_KEYS);
        vResultado = 0;
        } catch (SQLException ex) {
        //          JOptionPane.showMessageDialog(null,aQueryStr+"["+ex.getMessage()+"]");
        JOptionPane.showMessageDialog(null,"["+ex.getMessage()+"]");
        Logger.getLogger(fNomeClasse).log(Level.SEVERE, null, ex);
        vResultado = -2;
        }
        return vResultado;
         */
    }

    /**
     * 
     * @param aQueryStr
     * @param aNomeClasse
     * @return 
     */
    public int execUpdateAutoIncremento(
            final String aQueryStr,
            final Statement aStatement, 
            final String aNomeClasse) {
        int vResultado = execUpdate(aQueryStr, aStatement, aNomeClasse);
        if (vResultado == 1) {
            //int vResultado = execUpdate(aQueryStr, aNomeClasse);
        }
        return vResultado;
    }

    /**
     * 
     */
    public void carregarConjuntoDados(final String aQuery) {
        if (aQuery == null) {
            return;
        }
        ResultSet vRs = execSelect(aQuery, null, "");
        if (vRs != null) {
            try {
                boolean vContinuar = vRs.first();
                while (vContinuar) {
                    adicionarRegistroBd(vRs);
                    vContinuar = vRs.next();
                }
                //fEstruturaRegistroBd.atribuirTamanhosComponentes(vRs);
            } catch (SQLException ex) {
                Logger.getLogger(CConjuntoDadosBd.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                vRs.close();
            } catch (SQLException ex) {
                Logger.getLogger(CConjuntoDadosBd.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        if ((fConjuntoDados == null) || (fConjuntoDados.isEmpty())) {
            fEstruturaRegistroBd.limparComponentes();
        }
    }


    /**************************************************************************/
    /***                                                                    ***/
    /**************************************************************************/

    public void recarregarConjuntoDados(final String aQuery) {
        if (fConjuntoDados != null)
            fConjuntoDados.removeAllElements();
        carregarConjuntoDados(aQuery);
    }

    /**
     * 
     */
    @Override
    public void carregarConjuntoDados() {
        String vQuery = null;
        try {
            vQuery = getQueryConjuntoDadosBd();
        } catch (Exception ex) {
            Logger.getLogger(CConjuntoDadosBd.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (vQuery == null) {
            return;
        }
        carregarConjuntoDados(vQuery);
    }

    /**
     * 
     * @param aRsCabecalhoBd 
     */
    public void adicionarRegistroBd(ResultSet aRsCabecalhoBd) {
        CRegistroBd vRegistroBd = new CRegistroBd(fPertinenciaBd, aRsCabecalhoBd);
        fConjuntoDados.add(vRegistroBd);
    }

    /**
     * 
     */
    @Override
    public void eventoAntesInserirRegistro() {
        fEstruturaRegistroBd.eventoAntesInserirRegistro();
    }

    /**
     * 
     * @param aRegistro 
     */
    @Override
    public void eventoDepoisInserirRegistro(CRegistro aRegistro) {
        fEstruturaRegistroBd.eventoDepoisInserirRegistro(aRegistro);
    }

    /**
     * 
     */
    @Override
    public void eventoAntesMoverRegistro() {
        fEstruturaRegistroBd.eventoAntesMoverRegistro();
    }

    /**
     * 
     * @param aRegistro 
     */
    @Override
    public void eventoDepoisMoverRegistro(CRegistro aRegistro) {
        fEstruturaRegistroBd.eventoDepoisMoverRegistro(aRegistro);
    }


    /**
     * 
     */
    @Override
    public void eventoAntesGravarRegistro() {
        fEstruturaRegistroBd.eventoAntesGravarRegistro();
    }

    /**
     * 
     * @param aRegistro 
     */
    @Override
    public void eventoDepoisGravarRegistro(
            final CRegistro aRegistro, 
            final EStatusOperacao aStatusOperacao, 
            final int vResultado) {
        fEstruturaRegistroBd.eventoDepoisGravarRegistro(aRegistro);
        if (aStatusOperacao == EStatusOperacao.alteracao) {
            
        }
    }

    /**
     * 
     * @return 
     *
    public CRegistroBd inserirRegistroBd() {
        eventoAntesInserirRegistro();
        CRegistroBd vRegistroBd = new CRegistroBd(fPertinenciaBd, null);
        fConjuntoDados.add(vRegistroBd);
        eventoDepoisInserirRegistro(vRegistroBd);
        return vRegistroBd;
    }
    /**
     * 
     */
}
